package cn.tedu.loding.service.impl;


import cn.tedu.loding.ex.ServiceException;
import cn.tedu.loding.mapper.AlbumMapper;
import cn.tedu.loding.mapper.PictureMapper;
import cn.tedu.loding.pojo.dto.PictureAddNewDTO;
import cn.tedu.loding.pojo.dto.PictureUpdateDTO;
import cn.tedu.loding.pojo.entity.Album;
import cn.tedu.loding.pojo.entity.Picture;
import cn.tedu.loding.pojo.vo.*;
import cn.tedu.loding.service.IPictureService;
import cn.tedu.loding.web.ServiceCode;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

/**
 * 处理图片数据的业务实现类
 *
 * @author java@tedu.cn
 * @version 0.0.1
 */
@Slf4j
@Service
public class PictureServiceImpl implements IPictureService {

    @Autowired
    private PictureMapper pictureMapper;
    @Autowired
    private AlbumMapper albumMapper;

    public PictureServiceImpl() {
        log.debug("创建业务对象：PictureServiceImpl");
    }

    public PageInfo<PictureListItemVO> getAllPictureByPage(Integer page, Integer pageSize){
        // Pagehepler框架实现分页功能最核心的代码,是要编写在执行查询数据库代码之前的
        // PageHelper.startPage方法就是在设置分页的查询条件
        // page是查询的页码(从1开始),pageSize是每页条数
        PageHelper.startPage(page,pageSize);
        // 上面设置好分页查询条件,下面的查询在执行时,sql语句会自动被追加limit关键字
        List<PictureListItemVO>list= pictureMapper.list();

        // list变量并不是全查结果,而是只包含指定页码内容的数据
        // 我们分页业务功能不能只返回分页查询结果,还需要提供分页信息
        // PageHelper框架提供了PageInfo类,既能保存分页结果,也能保存分页信息
        // 分页信息无需我们计算,直接实例化PageInfo对象,它会自动根据上面的查询生成
        return new PageInfo<>(list);
    }



    @Override
    public void addNew(PictureAddNewDTO pictureAddNewDTO) {
        log.debug("开始处理【添加图片】的业务，参数：{}", pictureAddNewDTO);
        // 调用AlbumMapper对象的int countByName(String name)方法统计此名称的相册的数量
        Long albumId = pictureAddNewDTO.getAlbumId();
        AlbumStandardVO album = albumMapper.getStandardById(albumId);
        // 判断图片所属相册是否存在
        if (album == null) {
            // 是：图片所属的相册不存在
            String message = "添加图片失败！相册不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND,message);
        }

        //准备需要添加到数据库的对象
        Picture picture = new Picture();
        BeanUtils.copyProperties(pictureAddNewDTO, picture);
        log.debug("即将插入图片数据：{}", picture);

        //执行插入数据
        int rows = pictureMapper.insert(picture);
        if (rows != 1){
            String message = "添加图片失败，服务器忙，请稍后再尝试！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_INSERT,message);
        }
        log.debug("插入图片数据完成");
    }

    @Override
    public void delete(Long id) {
        log.debug("开始处理【根据id删除图片】的业务，参数：{}", id);
        // 调用Mapper对象的getStandardById()执行查询
        PictureStandardVO queryResult = pictureMapper.getStandardById(id);
        // 判断查询结果是否为null
        if (queryResult == null) {
            // 是：无此id对应的数据，将不允许执行删除操作，则抛出异常
            String message = "删除图片失败，尝试访问的数据不存在！";
            log.debug(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        // 调用Mapper对象的deleteById()方法执行删除
        log.debug("即将执行删除，参数：{}", id);
        pictureMapper.deleteById(id);
    }

    @Override
    public PictureStandardVO getStandardById(Long id) {
        log.debug("开始处理【根据id查询图片】业务,参数为:{}",id);
        PictureStandardVO standardById = pictureMapper.getStandardById(id);
        if (standardById == null) {
            String message = "获取图片详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }
        return standardById;
    }

    @Override
    public void update(Long id, PictureUpdateDTO pictureUpdateDTO) {
        PictureStandardVO standardById = pictureMapper.getStandardById(id);
        // 判断查询结果是否为null
        if (standardById == null) {
            // 是：此id对应的数据不存在，则抛出异常(ERR_NOT_FOUND)
            String message = "修改图片详情失败，尝试访问的数据不存在！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_NOT_FOUND, message);
        }

        Picture picture = new Picture();
        BeanUtils.copyProperties(pictureUpdateDTO, picture);
        picture.setId(id);
        // 修改数据
        log.debug("即将修改数据：{}", picture);
        int rows = pictureMapper.update(picture);
        if (rows != 1) {
            String message = "修改图片详情失败，服务器忙，请稍后再次尝试！";
            log.warn(message);
            throw new ServiceException(ServiceCode.ERR_UPDATE, message);
        }
    }

}
